package net.atos.java.example.boodschappen.persistence.model;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.Index;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import net.atos.java.example.boodschappen.model.Entity;
import net.atos.java.example.boodschappen.model.Gebruiker;

/**
 * Beschrijft een persistente gebruiker.
 * 
 * @author Pal Hargitai
 */
@PersistenceCapable
public class PersistentGebruiker implements Entity<String> {

	/** De primaire sleutel. */
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.UUIDHEX)
	private String pk;
	/** De identificatie. */
	@Persistent
	@Index(unique = "true", name = "persistent_gebruiker_id_idx")
	private String id;
	/** De naam. */
	@Persistent
	private String naam;
	/** Gebruiker email adres. */
	@Persistent
	private String email;
	/**
	 * Haalt de pk waarde op.
	 * @return De pk waarde.
	 */
	public String getPk() {
		return pk;
	}
	/**
	 * Zet een nieuwe waarde voor het pk veld.
	 * @param pk De nieuwe waarde voor het pk veld.
	 */
	public void setPk(String pk) {
		this.pk = pk;
	}
	/**
	 * Haalt de id waarde op.
	 * @return De id waarde.
	 */
	public String getId() {
		return id;
	}
	/**
	 * Zet een nieuwe waarde voor het id veld.
	 * @param id De nieuwe waarde voor het id veld.
	 */
	public void setId(String id) {
		this.id = id;
	}
	/**
	 * Haalt de naam waarde op.
	 * @return De naam waarde.
	 */
	public String getNaam() {
		return naam;
	}
	/**
	 * Zet een nieuwe waarde voor het naam veld.
	 * @param naam De nieuwe waarde voor het naam veld.
	 */
	public void setNaam(String naam) {
		this.naam = naam;
	}
	/**
	 * Haalt de email waarde op.
	 * @return De email waarde.
	 */
	public String getEmail() {
		return email;
	}
	/**
	 * Zet een nieuwe waarde voor het email veld.
	 * @param email De nieuwe waarde voor het email veld.
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/** {@inheritDoc} */
	@Override
	public String getIdentificatie() {
		return getPk();
	}

	/** De bouwer. */
	public static class Builder {
		/** Primaire sleutel. */
		private String pk;
		/** Identificatie. */
		private String id;
		/** Naam. */
		private String naam;
		/** Email adres. */
		private String email;

		/**
		 * Zet de primaire sleutel.
		 * @param pk De primaire sleutel.
		 * @return De bouwer.
		 */
		public Builder pk(String pk) {
			this.pk = pk;
			return this;
		}
		/**
		 * Zet de identificatie.
		 * @param pk De identificatie.
		 * @return De bouwer.
		 */
		public Builder id(String id) {
			this.id = id;
			return this;
		}
		/**
		 * Zet de naam.
		 * @param pk De naam.
		 * @return De bouwer.
		 */
		public Builder naam(String naam) {
			this.naam = naam;
			return this;
		}
		/**
		 * Zet het email adres.
		 * @param pk De het email adres.
		 * @return De bouwer.
		 */
		public Builder email(String email) {
			this.email = email;
			return this;
		}

		/**
		 * Vult de gebruiker op basis van de domein gebruiker.
		 * @param gebruiker De beginnende gebruiker.
		 * @return De builder.
		 */
		public Builder gebruiker(Gebruiker gebruiker) {
			pk(gebruiker.getPk()).naam(gebruiker.getNaam()).email(gebruiker.getEmail()).id(gebruiker.getId());
			return this;
		}

		/**
		 * Bouwt de gebruiker.
		 * @return De gebruiker.
		 */
		public PersistentGebruiker build() {
			PersistentGebruiker gebruiker = new PersistentGebruiker();
			gebruiker.setId(id);
			gebruiker.setNaam(naam);
			gebruiker.setEmail(email);
			gebruiker.setPk(pk);
			return gebruiker;
		}
	}
}
